package br.com.gaspar.bo;

import java.math.BigDecimal;

import gov.sefaz.utils.exception.BaseException;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.gaspar.bo.iface.IPagamentoVendaBO;
import br.com.gaspar.dao.iface.IGasparDAO;
import br.com.gaspar.entidade.PagamentoVenda;
import br.com.gaspar.entidade.SituacaoLancamento;

@Stateless
@Local(IPagamentoVendaBO.class)
public class PagamentoVendaBO extends GasparBaseBO<PagamentoVenda> implements IPagamentoVendaBO {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@EJB
	private IGasparDAO<PagamentoVenda> dao;

	
	@Override
	public IGasparDAO<PagamentoVenda> getDAOPadrao() {
		return dao;
	}
	
	@Override
	protected void gravarAntes(PagamentoVenda entidade) throws BaseException {
		BigDecimal total = buscarPagamentosPorVenda(entidade.getVenda().getId()); 
		entidade.getVenda().setSaldo(entidade.getVenda().getValorTotal().subtract(total));
		entidade.getVenda().setValorTotalPago(entidade.getVenda().getValorTotalPago().add(entidade.getValor()));
		if(entidade.getVenda() == null){
			throw new BaseException("Obrigatório relacionar a qual venda pertence o pagamento!");
		}
		
		if(entidade.getValor().compareTo(entidade.getVenda().getValorTotal()) > 0){
			throw new BaseException("O valor lançado é maior que valor devido!");
		}
		
		if(entidade.getVenda().getSaldo().compareTo(entidade.getValor()) < 0){
			throw new BaseException("O valor lançado é maior que o saldo do valor devido!");
		}
		
		if(entidade.getVenda().getSaldo().subtract(entidade.getValor()).doubleValue() == BigDecimal.ZERO.doubleValue()){
			entidade.getVenda().setSituacao(SituacaoLancamento.P);
		}
	}
	
	@Override
	public BigDecimal buscarPagamentosPorVenda(Long idVenda) throws BaseException{
		BigDecimal valor = null;
		try {
			valor = (BigDecimal) buscarPorNamedQuery2("PagamentoVenda.buscarTotalPorVenda", idVenda);
			if(valor == null){
				valor = new BigDecimal(0);
			}
		} catch (BaseException e) {
			throw e;
		}
		
		return valor;
	}
	
}
